/**
 * 给定一个正整数 n，生成一个包含 1 到 n^2 所有元素，且元素按顺时针顺序螺旋排列的正方形矩阵。
 * 输入：3
 * 输出：[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
 */
var generateMatrix = function (n) {
  let startX = 0;   // 起始位置
  let startY = 0;   // 起始位置
  let loop = Math.floor(n / 2);   // 旋转圈数
  let mid = Math.floor(n / 2);    // 中间位置
  let offset = 1;    // 控制每一层填充元素个数
  let count = 1;     // 更新填充数字
  let res = new Array(n).fill(0).map(() => new Array(n).fill(0));

  while (loop--) {
    let row = startX, col = startY;
    // 上行从左到右（左闭右开）
    for (; col < startY + n - offset; col++) {
      res[row][col] = count++;
    }
    // 右列从上到下（左闭右开）
    for (; row < startX + n - offset; row++) {
      res[row][col] = count++;
    }
    // 下行从右到左（左闭右开）
    for (; col > startX; col--) {
      res[row][col] = count++;
    }
    // 左列做下到上（左闭右开）
    for (; row > startY; row--) {
      res[row][col] = count++;
    }

    // 更新起始位置
    startX++;
    startY++;

    // 更新offset
    offset += 2;
  }
  // 如果n为奇数的话，需要单独给矩阵最中间的位置赋值
  if (n % 2 === 1) {
    res[mid][mid] = count;
  }
  return res;
};

/**
 * 给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素
 * 输入：[[1,2,3],[4,5,6],[7,8,9]]
 * 输出：[1,2,3,6,9,8,7,4,5]
 */
var spiralOrder = function (matrix) {
  let totalCount = matrix.length * matrix[0].length
  let top = 0
  let buttom = matrix.length - 1
  let left = 0
  let right = matrix[0].length - 1
  let ans = []
  while (ans.length < totalCount) {
    for (let i = left; i <= right && top <= buttom; i++) {
      ans.push(matrix[top][i])
    }
    top += 1
    for (let i = top; i <= buttom && left <= right; i++) {
      ans.push(matrix[i][right])
    }
    right -= 1
    for (let i = right; i >= left && top <= buttom; i--) {
      ans.push(matrix[buttom][i])
    }
    buttom -= 1
    for (let i = buttom; i >= top && left <= right; i--) {
      ans.push(matrix[i][left])
    }
    left += 1
  }

  return ans
};